<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>this</title>
<body>
    <script>
//  bind call apply 这些函数哪儿来的？  来自Function.prototype原型（公用方法）
/*     function fn(a,b){
        console.log(this,a,b);
    }
    const fn2 = fn.bind({x:100},7,9);
    fn2();
   
    console.log(Function.prototype.bind);    
    // 所有的函数都来自于Function创造 Function显示原型上面的方法,Function实例上面都会挂载
    Function.prototype.bind2 = function(){console.log("bind2")};
    // 在函数Function的原型上挂载了一个bind2方法，所有的函数都将拥有这个方法
    function fn3(){};
    function fn4(){};
    fn3.bind2();
    fn4.bind2(); */
    // 要创建一个类型与bind的方法，就应该写成 Function.prototype的方法
    // 手写一个bind1函数让所有的function都可以使用
    Function.prototype.bind1 = function(){
        // 第一个参数是this
        // 获取函数的参数 arguments
        // 把函数的参数转换为数组 Array.from(arguments) || Array.prototype.slice.call(arguments)
        const args = Array.from(arguments);//把参数转换为数组
        // 获取一个参数
        const t = args.shift();
        // 获取当前函数 
        const self = this;
        // 返回一个函数
        return function(){
            return self.apply(t,args);
        }
    }
    function fn(a,b,c){
        console.log(this,a,b,c);
    }
    const fn2 = fn.bind1({x:80},15,25,35);
   
    </script>

</body>
</html>